#pragma once
#include <sys/epoll.h>

#include "LogMessage.hpp"

#include <iostream>

class Epoll
{
public:
    // 创建epoll模型
    static int CreateEpoll()
    {
        // 参数size随便给一个大于零的数就行
        int res = epoll_create(128);
        if(res == -1)
        {
            LogMessage(FATAL, "create epoll fail, errno[%d]::%s", errno, strerror(errno));
            exit(5); // 这里是为了和我Sock.hpp连着所以给的5，前面Sock最后一个退出码是4
        }
        
        // 返回epoll模型的文件描述符
        return res;
    }

    // 增删改
    static bool CtlEpoll(int epfd, int op, int fd, uint32_t events)
    {
        // 这里用的时候是光传一个events
        epoll_event event;
        event.events = events; // 只需要一个events就行
        event.data.fd = fd; // event data中的fd直接用参数中的fd

        int res = epoll_ctl(epfd, op, fd, &event);
        if(res == -1)
        {
            LogMessage(FATAL, "epoll_ctl fail, errno[%d]::%s", errno, strerror(errno));
            exit(6);
        }

        return res == 0;
    }

    // 等待就绪事件
    static int WaitEpoll(int epfd, epoll_event *events, int maxevents, int timeout)
    {
        int res = epoll_wait(epfd, events, maxevents, timeout);
        if(res == -1)
        {
            LogMessage(FATAL, "epoll_wait fail, errno[%d]::%s", errno, strerror(errno));
            exit(7);
        }

        return res;
    }
};